# 保留字 可通过内置的keyword查询
'''
['False', 'None', 'True', 'and', 'as', 'assert', 'async', 
'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 
'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 
'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 
'try', 'while', 'with', 'yield']
'''
import keyword
# print(keyword.kwlist)
# print(len(keyword.kwlist))

'''
变量名的命名规则同java大体一致，可以用中文不建议
标识符命名规则：
- 模块名尽量短小，全部小写，下划线分割
- 包名短小，.分割
- 类名首字母大写，内部类_开头首字母大写
- 方法，属性全小写，_分割

- 常量全大写，_分割
- _开头的变量函数   收保护，在import导入时无法导入
- __双下划线开头的是私有的
- __init__() 双下划线开头和结尾的是python专用标识

type(变量) 查看变量类型
id(变量) 返回变量内存地址
'''

# -------------------------数据类型------------------------
'''
整数 负无穷-正无穷
进制种类--引导符号--示例
十进制      无      123
二进制      0B      0B0101
八进制      0O      0O127
十六机制    0X      0X987A

浮点型 带. 精度问题，可用round()保留小数位
复数，实数和虚数组成，j表示.real 实数部分 .imag虚数部分
'''
a1 = 0b010
a2 = 0o123
a3 = 0x123F
print(a1,a2,a3)
b1 = 0.1
b2 = 0.2
print(b1+b2,round(b1+b2,2))
c1 = 123+456j
print(c1.real,c1.imag)

'''
字符串，字符数组 可单引号 可双引号 可3个引号
转义符\n \t \" \' \\ 
字符串截取：[x:y] 左闭右开
字符串索引除了正序还有反序，例如hello,正序是0-5，反序是-5 - -1
常用操作：x+y 连接，x*n 重复n次 x in s x是否在s中，返回布尔
'''
x = "hello"
y = "world"
print(x[3],x[-5])
print(x[1:5])
print(x+y)
print((x+y)*3)
print("hell" in x)

'''
布尔类型 True 1 False 0
bool()函数，返回对象的布尔值
返回False的情况：
False或None
数值中的0，0.0 虚数0
空序列，包含空字符串，空元组，空列表，空字典，空集合
自定义对象的实例，__bool__()方法返回false或__len__()方法返回0
'''

'''
数据类型转换，显式转换，隐式转换
int(x) 转整数
float(x) 转浮点
str(x) 转字符串
chr(x) 转字符
ord(x) 字符转换对应整数值
hex(x) 转16进制字符串
oct(x) 转8进制字符串
bin(x) 转2进制字符串
'''

'''
eval()函数：去掉字符串的引号，执行字符串内容，常与input()配合使用
'''
x = 3
str = "x + 3"
str2 = "y"
do = eval(str)
print(type(do),do,eval(str2))

# ----------------------运算符--------------------------------
'''
 加 +
 减 -
 乘 *
 除 /
 整除(舍余) //   print(10 // 3) --> 3
 余 %
 幂 **
 
赋值运算符 优先级依次递增
 += -= 
 *= /= //= %=
 **=

比较运算符
 > < >= <= == !=

逻辑运算符 and和or均为短路
 and 逻辑与 &&
 or 逻辑或 ||
 not 逻辑非 !

 位运算符
 位与&
    0000 1100
   &0000 1000
   =0000 1000
 位或|
    0000 0100
   |0000 1000
   =0000 1100
 亦或^(同类取0 不同取1)
    0001 1111
   ^0001 0110
   =0000 1001
 取反~
   ~1111 0010
   =0000 1101
左移<< 高位溢出丢弃，低位补0，相当于乘以n次2
右移>> 高位补最高位（保留符号位），低位溢出丢弃,相当于除以n次2，向下取整
左乘右除：
    2<<3 2*2*2
    -10>>1 -10//2

优先级
** 幂
~ + - 取反，正号，负号
* / % // 乘 除 余 整除
+ - 加 减
<< >> 左移右移
& 位与
^ 亦或
| 位或
< <= > >= != == 比较运算符
'''